import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('../images'
                 '/otus.png', 0)
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 简单阈值
# Otsu 二值化阈值
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 高斯去噪后二值化处理
blur = cv2.GaussianBlur(img, (5, 5), 0)
ret3, th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

images = [img, 0, th1,  # 方法1：设置127为全局阈值
          img, 0, th2,  # 方法2：使用Otsu二值化
          blur, 0, th3]  # 方法3：先高斯去噪，再使用Otsu二值化

titles = ['Original Noisy Image', 'Histogram', 'Global Thresholding (v=127)',
          'Original Noisy Image', 'Histogram', 'Otsu\'s Thresholding',
          'Gaussian filtered Image', 'Histogram', 'Otsu\'s Thresholding']

# 这里使用了pyplot中画直方图方法，plt.hist，要注意的是它的参数是一维数组
# 所以这里使用了（numpy）ravel方法，将多维数组转换成一维
for i in range(3):
    plt.subplot(3, 3, i * 3 + 1), plt.imshow(images[i * 3], 'gray')  # i行，1列
    # plt.title(titles[i*3])：设置当前子图的标题。
    # plt.xticks([])和plt.yticks([])：隐藏坐标轴刻度，使图像显示更清晰。
    plt.title(titles[i * 3]), plt.xticks([]), plt.yticks([])
    plt.subplot(3, 3, i * 3 + 2), plt.hist(images[i * 3].ravel(), 256)  # i行,2列
    plt.title(titles[i * 3 + 1]), plt.xticks([]), plt.yticks([])
    plt.subplot(3, 3, i * 3 + 3), plt.imshow(images[i * 3 + 2], 'gray')  # i行，3列
    plt.title(titles[i * 3 + 2]), plt.xticks([]), plt.yticks([])

plt.show()